package models

import (
	"github.com/beego/beego/v2/client/orm"
)

// 预订单状态
const (
	PreOrderStatusPending   int8 = 0 // 待支付
	PreOrderStatusConfirmed int8 = 1 // 已确认(转为正式订单)
	PreOrderStatusCancelled int8 = 2 // 已取消
	PreOrderStatusExpired   int8 = 3 // 已过期
)

// PreOrder 预订单模型，用于存储用户下单但未完成支付的订单信息
type PreOrder struct {
	BaseModel
	PreOrderNo        string `orm:"size(64)" json:"pre_order_no"`          // 预订单号
	UserId            int64  `orm:"index" json:"user_id"`                  // 用户ID
	MemberId          int64  `orm:"index" json:"member_id"`                // 会员ID
	UserName          string `orm:"size(64)" json:"user_name"`             // 用户姓名
	Phone             string `orm:"size(20)" json:"phone"`                 // 手机号
	Status            int8   `orm:"default(0)" json:"status"`              // 状态：0:待支付 1:已确认 2:已取消 3:已过期
	TotalAmount       int64  `json:"total_amount"`                         // 总金额（分）
	PayAmount         int64  `json:"pay_amount"`                           // 支付金额（分）
	BalanceAmount     int64  `json:"balance_amount"`                       // 余额支付金额（分）
	UseBalance        int8   `orm:"default(0)" json:"use_balance"`         // 是否使用余额支付：0:否 1:是
	PaymentChannel    string `orm:"size(32)" json:"payment_channel"`       // 支付渠道
	VenueId           int64  `orm:"index" json:"venue_id"`                 // 场馆ID
	StoreId           int64  `orm:"index" json:"store_id"`                 // 门店ID
	StartTime         int64  `json:"start_time"`                           // 开始时间
	EndTime           int64  `json:"end_time"`                             // 结束时间
	ExpireTime        int64  `json:"expire_time"`                          // 过期时间
	CouponId          int64  `orm:"default(0)" json:"coupon_id"`           // 优惠券ID
	GroupBuyId        int64  `orm:"default(0)" json:"group_buy_id"`        // 团购券ID
	Remark            string `orm:"size(255)" json:"remark"`               // 备注
	OrderId           int64  `orm:"default(0)" json:"order_id"`            // 关联的订单ID（确认后）
	Type              int8   `orm:"default(0)" json:"type"`                // 类型：0:普通预约 1:续单
	OriginalBookingId int64  `orm:"default(0)" json:"original_booking_id"` // 原订单ID（续单类型时）
}

// TableName 设置表名
func (b *PreOrder) TableName() string {
	return "ss_pre_order"
}

// GetPreOrderById 根据ID获取预订单
func GetPreOrderById(id int64) (*PreOrder, error) {
	preOrder := &PreOrder{BaseModel: BaseModel{Id: id}}
	o := orm.NewOrm()
	err := o.Read(preOrder)
	if err == orm.ErrNoRows {
		return nil, nil
	}
	return preOrder, err
}

// CreatePreOrderTx 在事务中创建预订单
func CreatePreOrderTx(tx orm.TxOrmer, preOrder *PreOrder) (int64, error) {
	preOrder.BeforeInsert()
	return tx.Insert(preOrder)
}

// GetPreOrderByOrderNo 根据预订单号获取预订单
func GetPreOrderByOrderNo(orderNo string) (*PreOrder, error) {
	o := orm.NewOrm()
	preOrder := &PreOrder{}
	err := o.QueryTable(preOrder).Filter("pre_order_no", orderNo).Filter("is_deleted", 0).One(preOrder)
	if err == orm.ErrNoRows {
		return nil, nil
	}
	return preOrder, err
}
